package com.example.websocket.service;

import com.alibaba.fastjson.JSON;
import com.example.websocket.model.Message;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author dangwen1
 * @date 2022年01月14日 15:18
 * @description
 */
@Slf4j
@Component
@ServerEndpoint(value = "/ws/chat")
public class ChatSocketServer {

    public static final AtomicInteger onlineCount = new AtomicInteger(0);
    public static Map<String, Session> clients = new ConcurrentHashMap<>();

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session) {
        String username=session.getRequestParameterMap().get("username").get(0);
        log.info("有新的客户端上线 sessionid={} username={}", session.getId(),username);
        clients.put(username,session);
        int cnt = onlineCount.incrementAndGet(); // 在线数加1
        log.info("有连接加入，当前在线人数为：{}", cnt);
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(Session session) {
        clients.remove(session);
        int cnt = onlineCount.decrementAndGet();
        log.info("在线人数为：{}", cnt);
    }

    /**
     * 出现错误
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("发生错误：{}，Session ID： {}",error.getMessage(),session.getId());
        error.printStackTrace();
    }

    /**
     * 收到客户端消息后调用的方法
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("消息：{}",message);
        //SendMessage(session, "收到消息，消息内容："+message);
    }


    /**
     * 发送消息，username为空就群发
     */
    public static void sendMessage(Message message){
        //username为空就群发
        try {
            if(StringUtils.isEmpty(message.getTo())){
                for (Map.Entry<String,Session> entry: clients.entrySet()) {
                    Session session=entry.getValue();
                    if(session.isOpen()){
                        session.getBasicRemote().sendText(JSON.toJSONString(message));
                    }
                }
            }else{
                for (Map.Entry<String,Session> entry: clients.entrySet()) {
                    if(entry.getKey().equals(message.getTo())){
                        Session session=entry.getValue();
                        if(session!=null && session.isOpen()){
                            session.getBasicRemote().sendText(JSON.toJSONString(message));
                        }else{
                            log.warn("没有找到你指定用户：{}",message.getTo());
                        }
                        break;
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
